#include <iostream>
#include "Test.h"
#include "Name.h"
#include "A.h"
#include "B.h"
using namespace std;

//构造函数调用规则
//当类中定义了一个构造函数(有参构造函数 赋值(拷贝)构造函数) 时，c++编译器不会提供无参构造函数
//在定义类时, 只要你写了构造函数 则必须要用
int main01(int argc, char const *argv[]){
        //Test t1;//调用无参构造函数 c++编译器报错
        return 0;
}

//浅拷贝和深拷贝
//浅拷贝只是简单的复制了类的属性
//对象析够的时候会宕掉 两个对象的属性指向同一块内存 肯定会出问题
//解决方案: 手工的编写拷贝构造函数 使用深拷贝
void objectplay(){
        Name obj1("abcdefg");
        Name obj2 = obj1; //默认拷贝构造函数 c++编译器给我提供的 是浅拷贝

        Name obj3("obj3");
        obj3 = obj1; // 等号操作 因为我们没用重载=号操作符 c++会默认简单的复制了类的属性 也是浅拷贝 也会出现上面同样的问题
}

int main02(int argc, char const *argv[]){
        objectplay();
        return 0;
}

//组合对象的构造方法初始化 调用顺序 析够顺序
//构造函数初始化列表 解决了 在B类中 组合了一个A类的对象(A类设计了构造函数)
//根据构造函数的调用规则 写了构造A的构造函数 必须要用 没有机会初始化A
//新的语法 Constructor:Constructor():m1(v1),m2(v1,v2),m3(v3)
                     //B::B(int _b1, int _b2): a1(1), a2(2)
                     //B::B(int _b1, int _b2, int m , int n):a1(m),a2(n)
//构造函数初始化调用顺序
        //先执行 被组合对象的构造函数
        //如果组合对象有多个, 按照定义的顺序 而不是按照初始化列表的顺序
//析够函数: 与构造函数的调用顺序相反
int main(int argc, char const *argv[]){
        //A a1(10);
        //B objb(1, 2);

        //参数传递
        B objb2(3, 4, 5, 6);
        //调用顺序

        return 0;
}

